package cn.net.dckj.common.core.api.service;

import cn.net.dckj.common.core.api.IService;
import cn.net.dckj.common.core.domain.BaseEntity;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * Created by DIY_PC on 2019-5-28.
 */
public interface IBizService<T extends BaseEntity> extends IService {
    /**
     * 新增数据，带多附件上传
     *
     * @param entity
     * @param files
     * @return
     */
    T insert(T entity, List<MultipartFile> files);

    /**
     * 逻辑删除数据信息
     *
     * @param entity 需要删除的实体
     * @return 结果
     */
    int logicDeleteById(T entity);

    /**
     * 逻辑删除数据信息
     *
     * @param ids    需要删除的数据ID
     * @param entity
     * @return 结果
     */
    int logicDeleteByIds(String ids, T entity);

    /**
     * Excel导入数据
     *
     * @param entityList      实体数据列表
     * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
     * @return 结果
     */
    String importEntity(List<T> entityList, Boolean isUpdateSupport);

    /**
     * 后台使用校验数据方法
     *
     * @param entity 需要校验的实体
     * @return isNotEmpty返回error信息
     */
    String validate(T entity);

    /**
     * 据自定义查询验证是否存在这个数(excel导入、后台数据验证使用)
     * 需要自己根据业务实现，规则：若数据唯一性一个（如表中仅代码唯一），则返回查询的数据id;
     * 若数据唯一性多个（如表中代码唯一，名称也必须唯一），则直接返回某某数据存在提示，记录于keyValue中
     * 这时返回值不需要给定，使用默认返回0L，调用使用该方法会根据keyValue是否为空判断是否存在数据
     *
     * @param entity   查询条件
     * @param keyValue 记录返回值，多值用/分隔
     * @return 数据唯一性一个返回查询实体id，要求id>0，若id<1查询无记录；
     * 若数据唯一性多个，默认返回0L，根据keyValue是否空判断是否查询存在数据
     */
    Long checkUnique(T entity, StringBuilder keyValue);

    /**
     * 校验数据是否唯一，前台jquery调用
     *
     * @param entity 数据唯一条件
     * @return 结果
     */
    String checkUnique(T entity);

    /**
     * 查询多附件列表
     *
     * @param entity
     * @return
     */
    List<T> selectAttachmentList(T entity);

    /********** 以下功能为网站前台和手机端提供服务接口 **********/
    /**
     * 查询有效数据列表(适用移动端)
     *
     * @param entity 数据信息
     * @return 数据集合
     */
    List<T> selectListToMobile(T entity);
}
